/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo.persistencia;

import java.util.*;
import java.sql.*;
import modelo.IArticulosAlmacen;
import modelo.ArticulosAlmacen;
/**
 *
 * @author Juanma
 */
public class ArticulosAlmacenDAO implements IArticulosAlmacenDAO{

    public IArticulosAlmacen read(int ID) {
        IArticulosAlmacen c = null;
        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM articulo where cod_articulo=" + ID);
            String nombre=null, observaciones=null;
            double precio=0;
            int cantidad=0;
            if (res.next()) {
                nombre = res.getString("nombre");
                observaciones = res.getString("observaciones");
            }
            ResultSet res1 = stmt.executeQuery("SELECT * FROM art_almacen where cod_articulo=" + ID);
            if (res1.next()) {
                precio = res1.getDouble("precio");
                cantidad = res1.getInt("cantidad");
            }
            c = new ArticulosAlmacen(ID,cantidad,precio,nombre,observaciones);
        } catch (SQLException e) {
            System.out.println(e+ " read ");
        } finally {
            Persistencia.closeConnection();
        }
        return c;
    }

    public void update(IArticulosAlmacen articulos, int cant) {
        String sql=null;
          // BUSCAMOS LA CANTIDAD DEL ARTICULO QUE SE QUIERE VENDER

          try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("Select cantidad,precio from art_almacen where cod_articulo=" + articulos.getID());
            int cantidad=0;
            double precio=0;
            if (res.next()) {
                cantidad = res.getInt("cantidad");
                precio = res.getDouble("precio");
            }
           
            int nuevacantidad=cantidad-cant;
            
            sql = "UPDATE art_almacen SET cantidad =" + nuevacantidad + " WHERE cod_articulo =" + articulos.getID();
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.execute();

            

            ResultSet res1 = stmt.executeQuery("Select saldo from cuenta where id_cuenta=0");
            double saldo=0;
            if (res1.next()) {
                saldo = res1.getDouble("saldo");
            }

            double nuevosaldo=saldo+(cant*precio);
            
            

            sql = "UPDATE cuenta SET saldo = " + nuevosaldo + " WHERE id_cuenta = 0";
            PreparedStatement stm1 = Persistencia.createConnection().prepareStatement(sql);
            stm1.execute();

            // HASTA AQUI FUNCIONA
            
            sql = "insert into venta(dni,fecha,importe) values (1,?,?)";
            PreparedStatement stm2 = Persistencia.createConnection().prepareStatement(sql);
            //double vendido=cant*precio;
            Calendar calendario = Calendar.getInstance();
            java.util.Date now = calendario.getTime();
            java.sql.Timestamp fecha = new java.sql.Timestamp(now.getTime());
            System.out.println (fecha);
            stm2.setTimestamp(1, fecha);
            stm2.setDouble(2, cant*precio);
            stm2.execute();

            

            ResultSet res2 = stmt.executeQuery("Select max(cod_venta) from venta");
            int codigoventa=0;
            if (res2.next()) {
                codigoventa = res2.getInt("max(cod_venta)");
            }


            sql = "insert into venta_articulo(cod_venta,cod_articulo,cantidad_vendida) values (?,?,?)";
            PreparedStatement stm3 = Persistencia.createConnection().prepareStatement(sql);
            stm3.setInt(1, codigoventa);
            stm3.setInt(2, articulos.getID());
            stm3.setInt(3, cant);
            stm3.execute();
        
        } catch (SQLException e) {
            System.out.println(e + " update");
        } finally {
            Persistencia.closeConnection();
        }
    }

    public List<IArticulosAlmacen> list() {
        List<IArticulosAlmacen> artalmacen = new ArrayList<IArticulosAlmacen>();

        try {

            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM articulo a,art_almacen b where a.cod_articulo=b.cod_articulo");
            String nombre=null, observaciones=null;
            double precio=0;
            int cantidad=0,id;
            while (res.next()) {
                nombre = res.getString("nombre");
                observaciones = res.getString("observaciones");
                id = res.getInt("cod_articulo");

                precio = res.getDouble("precio");
                cantidad = res.getInt("cantidad");
                artalmacen.add(new ArticulosAlmacen(id,cantidad,precio,nombre,observaciones));
            }

        } catch (SQLException e) {
            System.out.println(e + " list");
        } finally {
            Persistencia.closeConnection();
        }
        return artalmacen;
    }

        public void devolver (IArticulosAlmacen articulos, int cant) {
        String sql=null;
          // BUSCAMOS LA CANTIDAD DEL ARTICULO QUE SE QUIERE VENDER

          try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("Select cantidad,precio from art_almacen where cod_articulo=" + articulos.getID());
            int cantidad=0;
            double precio=0;
            if (res.next()) {
                cantidad = res.getInt("cantidad");
                precio = res.getDouble("precio");
            }

            int nuevacantidad=cantidad+cant;

            sql = "UPDATE art_almacen SET cantidad =" + nuevacantidad + " WHERE cod_articulo =" + articulos.getID();
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.execute();



            ResultSet res1 = stmt.executeQuery("Select saldo from cuenta where id_cuenta=0");
            double saldo=0;
            if (res1.next()) {
                saldo = res1.getDouble("saldo");
            }

            double nuevosaldo=saldo-(cant*precio);



            sql = "UPDATE cuenta SET saldo = " + nuevosaldo + " WHERE id_cuenta = 0";
            PreparedStatement stm1 = Persistencia.createConnection().prepareStatement(sql);
            stm1.execute();


        } catch (SQLException e) {
            System.out.println(e + " update");
        } finally {
            Persistencia.closeConnection();
        }
    }

    public void comprarArticulos(IArticulosAlmacen articulos, int cant) {
        String sql=null;
          // BUSCAMOS LA CANTIDAD DEL ARTICULO QUE SE QUIERE VENDER

          try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("Select cantidad from art_almacen where cod_articulo=" + articulos.getID());
            int cantidad=0;
            if (res.next()) {
                cantidad = res.getInt("cantidad");
            }

            ResultSet res1 = stmt.executeQuery("Select saldo from cuenta where id_cuenta=0");
            double saldo=0;
            if (res1.next()) {
                saldo = res1.getDouble("saldo");
            }

            ResultSet res2 = stmt.executeQuery("Select id from proveedor where defecto=true");
            int provdefecto=0;
            if (res2.next()) {
                provdefecto = res2.getInt("id");
            }

            ResultSet res3 = stmt.executeQuery("Select cantidad,precio from art_proveedor where cod_articulo=" + articulos.getID() + " and id=" + provdefecto);
            int cantidadArti=0;
            double prec=0;
            if (res3.next()) {
                cantidadArti = res3.getInt("cantidad");
                prec = res3.getDouble("precio");
            }

            if(cantidadArti>=cant){
                cantidadArti=cantidadArti-cant;

                String sql5 = "UPDATE art_proveedor SET cantidad = " + cantidadArti + " WHERE id = " + provdefecto + " and cod_articulo=" + articulos.getID();
                PreparedStatement stm2 = Persistencia.createConnection().prepareStatement(sql5);
                stm2.execute();

                double nuevosaldo=saldo-(cant*prec);

                sql = "UPDATE cuenta SET saldo = " + nuevosaldo + " WHERE id_cuenta = 0";
                PreparedStatement stm1 = Persistencia.createConnection().prepareStatement(sql);
                stm1.execute();

                ResultSet res6 = stmt.executeQuery("Select count(*) from compra");
                int codigocompra=0;
                if (res6.next()) {
                    codigocompra = res6.getInt("count(*)");
                }

                int nuevacantidad=cantidad+cant;

                sql = "UPDATE art_almacen SET cantidad =" + nuevacantidad + " WHERE cod_articulo =" + articulos.getID();
                PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
                stm.execute();

                codigocompra=codigocompra+1;
                sql = "insert into compra(cod_compra,id_proveedor,fecha,importe) values (?,?,?,?)";
                PreparedStatement stm4 = Persistencia.createConnection().prepareStatement(sql);
                //double vendido=cant*precio;
                Calendar calendario = Calendar.getInstance();
                java.util.Date now = calendario.getTime();
                java.sql.Timestamp fecha = new java.sql.Timestamp(now.getTime());
                System.out.println (fecha);
                stm4.setInt(1, codigocompra);
                stm4.setInt(2, provdefecto);
                stm4.setTimestamp(3, fecha);
                stm4.setDouble(4, cant*prec);
                stm4.execute();

                res6 = stmt.executeQuery("Select count(*) from compra_articulo");
                int codigocomp=0;
                if (res6.next()) {
                    codigocomp = res6.getInt("count(*)");
                }

                codigocomp=codigocomp+1;
                sql = "insert into compra_articulo(cod_compra,cod_articulo,id_proveedor,cantidad_comprada) values (?,?,?,?)";
                stm4 = Persistencia.createConnection().prepareStatement(sql);
                //double vendido=cant*precio;
                stm4.setInt(1, codigocomp);
                stm4.setInt(2, articulos.getID());
                stm4.setInt(3, provdefecto);
                stm4.setDouble(4, cant);
                stm4.execute();

            }else{
                List<Integer> proveedores = new LinkedList<Integer>();

                Statement stmt7 = Persistencia.createConnection().createStatement();
                ResultSet res7 = stmt7.executeQuery("Select id from proveedor where defecto=false");
                int identificacion=0;
                if (res7.next()) {
                    identificacion = res7.getInt("id");
                    proveedores.add(identificacion);
                }
                System.out.println (proveedores);

                Iterator it=proveedores.listIterator();
                boolean comprado=false;
                while(it.hasNext() && comprado==false){

                    int identif=(Integer)it.next();
                    ResultSet res8 = stmt.executeQuery("Select cantidad,precio from art_proveedor where cod_articulo=" + articulos.getID() + " and id=" + identif);
                    int cantidadArt=0;
                    double preci=0;
                    if (res8.next()) {
                        cantidadArt = res8.getInt("cantidad");
                        preci = res8.getDouble("precio");
                    }
                System.out.println (cantidadArt + " " + preci);

                if(cantidadArt>=cant){
                comprado=true;
                cantidadArt=cantidadArt-cant;

                String sql5 = "UPDATE art_proveedor SET cantidad = " + cantidadArt + " WHERE id = " + identif + " and cod_articulo=" + articulos.getID();
                PreparedStatement stm2 = Persistencia.createConnection().prepareStatement(sql5);
                stm2.execute();

                double nuevosaldo=saldo-(cant*preci);

                sql = "UPDATE cuenta SET saldo = " + nuevosaldo + " WHERE id_cuenta = 0";
                PreparedStatement stm1 = Persistencia.createConnection().prepareStatement(sql);
                stm1.execute();

                ResultSet res6 = stmt.executeQuery("Select count(*) from compra");
                int codigocompra=0;
                if (res6.next()) {
                    codigocompra = res6.getInt("count(*)");
                }

                int nuevacantidad=cantidad+cant;

                sql = "UPDATE art_almacen SET cantidad =" + nuevacantidad + " WHERE cod_articulo =" + articulos.getID();
                PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
                stm.execute();

                codigocompra=codigocompra+1;
                sql = "insert into compra(cod_compra,id_proveedor,fecha,importe) values (?,?,?,?)";
                PreparedStatement stm4 = Persistencia.createConnection().prepareStatement(sql);
                //double vendido=cant*precio;
                Calendar calendario = Calendar.getInstance();
                java.util.Date now = calendario.getTime();
                java.sql.Timestamp fecha = new java.sql.Timestamp(now.getTime());
                System.out.println (fecha);
                stm4.setInt(1, codigocompra);
                stm4.setInt(2, identif);
                stm4.setTimestamp(3, fecha);
                stm4.setDouble(4, cant*prec);
                stm4.execute();

                res6 = stmt.executeQuery("Select count(*) from compra_articulo");
                int codigocomp=0;
                if (res6.next()) {
                    codigocomp = res6.getInt("count(*)");
                }

                codigocomp=codigocomp+1;
                sql = "insert into compra_articulo(cod_compra,cod_articulo,id_proveedor,cantidad_comprada) values (?,?,?,?)";
                stm4 = Persistencia.createConnection().prepareStatement(sql);
                //double vendido=cant*precio;
                stm4.setInt(1, codigocomp);
                stm4.setInt(2, articulos.getID());
                stm4.setInt(3, identif);
                stm4.setDouble(4, cant);
                stm4.execute();

            }

                }
            }
       
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            Persistencia.closeConnection();
        }
    }

}
